/**
 * 用户服务实现类 - 处理多租户用户管理的核心业务逻辑
 *
 * 开发人员：马勇俐
 * 开发时间：2025-11-16 至 2025-11-20
 * 模块职责：实现多租户用户的创建、查询、更新、删除等核心业务逻辑，维护企业内用户信息
 *
 * 技术要点：
 * - 多租户用户数据隔离和管理
 * - 用户名唯一性验证机制
 * - 用户信息完整性校验和更新
 * - 用户状态管理和生命周期控制
 * - 异常处理和事务管理机制
 *
 * 开发故事：负责用户服务的核心业务逻辑实现，与用户控制器和前端用户界面深度配合，确保多租户用户的完整管理和数据安全性。
 */
package com.pbl.service.impl;

import com.pbl.common.exception.BizException;
import com.pbl.entity.Enterprise;
import com.pbl.entity.User;
import com.pbl.repository.EnterpriseRepository;
import com.pbl.repository.UserRepository;
import com.pbl.service.UserService;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {

    private final UserRepository userRepository;
    private final EnterpriseRepository enterpriseRepository;

    /**
     * 构造用户服务实现
     * @param userRepository 用户数据访问层
     * @param enterpriseRepository 企业数据访问层
     */
    public UserServiceImpl(UserRepository userRepository, EnterpriseRepository enterpriseRepository) {
        this.userRepository = userRepository;
        this.enterpriseRepository = enterpriseRepository;
    }

    @Override
    public User create(Long enterpriseId, User u) {
        Enterprise ent = enterpriseRepository.findById(enterpriseId).orElseThrow(() -> new BizException(404, "企业不存在"));
        if (userRepository.existsByEnterprise_IdAndUsername(enterpriseId, u.getUsername())) {
            throw new BizException(400, "用户名已存在");
        }
        u.setId(null);
        u.setEnterprise(ent);
        return userRepository.save(u);
    }

    @Override
    public User update(Long id, User u) {
        User db = get(id);
        db.setEmail(u.getEmail());
        db.setPhone(u.getPhone());
        db.setStatus(u.getStatus());
        return userRepository.save(db);
    }

    @Override
    public User get(Long id) {
        return userRepository.findById(id).orElseThrow(() -> new BizException(404, "用户不存在"));
    }

    @Override
    public void delete(Long id) {
        userRepository.deleteById(id);
    }

    @Override
    public List<User> listByEnterprise(Long enterpriseId) {
        // 简化：直接全量查找后过滤（建议后续Pageable）
        return userRepository.findAll().stream().filter(u -> u.getEnterprise().getId().equals(enterpriseId)).toList();
    }
}
